Syntax20b.Scn.Fnt ParcElems Alloc Syntax24b.Scn.Fnt Syntax10.Scn.Fnt Syntax10i.Scn.Fnt Syntax10b.Scn.Fnt (* AMIGA *) MODULE AmigaTimer; (* updated OJ 8 May 96 *) IMPORT SYSTEM, E:=AmigaExec; CONST timerName * = "timer.device"; (* unit defintions *) microHz * = 0; vBlank * = 1; eClock * = 2; waitUntil * = 3; waitEClock * = 4; TimeValPtr * = LONGINT; TimeVal * = RECORD secs* : LONGINT; micro* : LONGINT END; EClockValPtr * = LONGINT; EClockVal * = RECORD hi* : LONGINT; lo* : LONGINT END; TimeRequestPtr * = LONGINT; TimeRequestPointer * = POINTER TO TimeRequest; TimeRequest * = RECORD (E.IORequest) time* : TimeVal END; CONST (* IO_COMMAND to use for adding a timer *) addRequest * = E.nonstd+0; getSysTime * = E.nonstd+1; setSysTime * = E.nonstd+2; timerBase-: E.LibraryPtr; waitReq : TimeRequestPtr; timerMP : E.MsgPortPtr; timerOpen : BOOLEAN; termEntry : E.TermEntry; PROCEDURE -ReturnD0 04EH,05EH, 04EH,075H; PROCEDURE AddTime*(dest, src : TimeValPtr); BEGIN SYSTEM.PUTREG( 8, dest ); SYSTEM.PUTREG( 9, src ); SYSTEM.CALL( -42, timerBase ); END AddTime; PROCEDURE SubTime*(dest, src : TimeValPtr); BEGIN SYSTEM.PUTREG( 8, dest ); SYSTEM.PUTREG( 9, src ); SYSTEM.CALL( -48, timerBase ); END SubTime; PROCEDURE CmpTime*(dest, src : TimeValPtr) : LONGINT; BEGIN SYSTEM.PUTREG( 8, dest ); SYSTEM.PUTREG( 9, src ); SYSTEM.CALL( -54, timerBase ); ReturnD0 END CmpTime; PROCEDURE ReadEClock*(dest : EClockValPtr) : LONGINT; BEGIN SYSTEM.PUTREG( 8, dest ); SYSTEM.CALL( -60, timerBase ); ReturnD0 END ReadEClock; PROCEDURE GetSysTime*(dest : TimeValPtr); BEGIN SYSTEM.PUTREG( 8, dest ); SYSTEM.CALL( -66, timerBase ); END GetSysTime; PROCEDURE Wait*(sec, micro: LONGINT); VAR wreq : TimeRequestPointer; r : SHORTINT; BEGIN wreq := SYSTEM.VAL( TimeRequestPointer, waitReq ); wreq.time.secs := sec; wreq.time.micro := micro; r := E.DoIO(waitReq) END Wait; PROCEDURE Term; BEGIN IF timerMP#0 THEN IF waitReq#0 THEN IF timerOpen THEN E.CloseDevice(waitReq) END; E.DeleteIORequest( waitReq ); END; E.DeleteMsgPort(timerMP) END; END Term; PROCEDURE Init; TYPE TReqPtr = POINTER TO TimeRequest; VAR wreq : TimeRequestPointer; BEGIN waitReq := 0; timerOpen := FALSE; timerMP:=E.CreateMsgPort(); IF timerMP#0 THEN waitReq := E.CreateIORequest( timerMP, SIZE(TimeRequest) ); IF waitReq#0 THEN timerOpen := ( E.OpenDevice(timerName, microHz, waitReq, {}) = 0 ); IF timerOpen THEN wreq := SYSTEM.VAL( TimeRequestPointer, waitReq ); wreq.command := addRequest; wreq.time.secs := 0; wreq.time.micro := 0; timerBase := wreq.device ELSE HALT(99) END; END; END; END Init; BEGIN E.Register(termEntry, Term); Init; END AmigaTimer.